home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 426-450 / disk_432 / apalasm / source / palasm24.for
Text File  |  1992-05-06  |  45KB  |  1,507 lines

  1. C**PALASM24**PALASM24**PALASM24**PALASM24**PALASM24**PALASM24**
  2. C
  3. C P A L A S M 2 4 - TRANSLATES SYMBOLIC EQUATIONS INTO PAL OBJECT
  4. C                    CODE FORMATTED FOR DIRECT INPUT TO STANDARD
  5. C                    PROM PROGRAMMERS.
  6. C
  7. C INPUT: PAL DESIGN SPECIFICATION ASSIGNED
  8. C          TO RPD(1). OPERATION CODES ARE
  9. C          ASSIGNED TO ROP(5).
  10. C
  11. C OUTPUT: ECHO,SIMULATION, AND FUSE PATTERN
  12. C           ARE ASSIGNED TO POF(6). HEX AND BINARY
  13. C          FORMATS ARE ASSIGNED TO PDF(6). PROMPTS
  14. C          AND ERROR MESSAGES ARE ASSIGNED TO PMS(6).
  15. C
  16. C PART NUMBER: THE PAL PART NUMBER MUST APPEAR IN
  17. C               COLUMN ONE OF LINE ONE.
  18. C
  19. C PIN LIST: 24 SYMBOLIC PIN NAMES MUST APPEAR STARTING
  20. C            ON LINE FIVE.
  21. C
  22. C EQUATIONS: STARTING FIRST LINE AFTER THE PIN LIST IN
  23. C             THE FOLLOWING FORMS:
  24. C
  25. C             A = B * C + D ; A EQUALS B AND C OR D
  26. C
  27. C             A := B * C + D ; A IS REPLACED AFTER LOW TO
  28. C                            ; HIGH TRANSISTION OF THE CLOCK
  29. C                            ; IF B AND C OR D
  30. C
  31. C             IF( A * B ) C = D + E ; IF A AND B ARE TRUE THEN
  32. C                                   ; C EQUALS D OR E
  33. C
  34. C ALL CHARACTERS FOLLOWING THE ';' ARE IGNORED UNTIL NEXT LINE
  35. C
  36. C BLANKS ARE IGNORED
  37. C
  38. C OPERATORS: (IN HIERARCHY OF EVALUATION )
  39. C
  40. C             ;        COMMENT FOLLOWS
  41. C             /        COMPLEMENT
  42. C             *        AND, PRODUCT
  43. C             +        OR, SUM
  44. C             :+:    EXCLUSIVE OR
  45. C             ( )    CONDITIONAL THREE STATE
  46. C             =         EQUALITY
  47. C             :=     REPLACE BY ( AFTER CLOCK )
  48. C
  49. C FUNCTION TABLE: L, H, X, Z, C ARE VALID FUNCTION
  50. C                  TABLE ENTRIES
  51. C
  52. C SUBROUTINES: INITLZ, GETSYM, INCR, MATCH, IXLATE,
  53. C               ECHO, PINOUT, PLOT, HEX, TWEEK, BINR,
  54. C               SLIP, FANTOM, IODC2, IODC4, TEST
  55. C
  56. C REV LEVEL: 07/20/81
  57. C
  58. C FINE PRINT: MONOLITHIC MEMORIES TAKES NO RESPONSIBILITY
  59. C              FOR THE OPERATION OR MAINTENANCE OF THIS PROGRAM.
  60. C              THE SOURCE CODE AS PRINTED HERE PRODUCED THE OBJECT 
  61. C              CODE OF THE EXAMPLES IN THE APPLICATIONS SECTION
  62. C              ON A VAX/VMS COMPUTER AND A NATIONAL CSS IBM
  63. C              SYSTEM/370 FORTRAN IV(G).
  64. C
  65. C****************************************************************
  66. C
  67. C Compile and Link using Absoft's AC/FORTRAN Ver. 2.3
  68. C
  69. C F77 -deksu palasm.for
  70. C
  71. C F77l -y -m -o apalasm24 palasm args.sub errmsg.sub
  72. C
  73. C MY USAGE FOR THE PROGRAM: apalasm24 filename
  74. C
  75. C INPUT: filename.pal
  76. C OUTPUT: The following files are generated from the following
  77. C          optional OPERATION CODES.
  78. C
  79. C            E = filename.src
  80. C            O = filename.pins
  81. C            T = filename.sim
  82. C            P = filename.plt
  83. C            B = filename.brf
  84. C            D = filename.jed
  85. C
  86. C          The other outputs were removed from the menu only
  87. C          because they are for paper tape type devices.
  88.  
  89. C****************************************************************
  90. C
  91.       PROGRAM PALASM
  92. C
  93. C****************************************************************
  94. C
  95. C
  96. C     MAIN PROGRAM
  97. C
  98.       IMPLICIT    NONE
  99.       INTEGER    IPAL(3),INAME(5),REST(72),PATNUM(80),TITLE(80),
  100.      .        COMP(80),ISYM(8,24),IBUF(8,24),IPAGE(80,200),
  101.      .        IFUNCT,IDESC,IEND,PMS,POF,PDF,E,O,T,P,B,D,ILE,ILL,
  102.      .        H,S,L,N,Q,U,F,BB,CC,DD,EE,FF,II,NN,OO,PP,RR,IMATCH,
  103.      .        SS,TT,UU,AA,LL,RPD,ROC,LEN,J,I,ITYPE,IC,IL,IBLOW,
  104.      .        I88PRO,I8PRO,C,IPROD,IINPUT,IOP,ILERR
  105.       LOGICAL    LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,
  106.      .        LFIRST,LMATCH,LFUSES(40,80),LPHASE(24),LBUF(24),
  107.      .        LPROD(80),LSAME,LACT,LOPERR,LHEAD
  108.       CHARACTER cmdline*20,filename*25
  109.       COMMON    LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  110.       COMMON    /PGE/ IPAGE(80,200)
  111.       COMMON      /FTEST/ IFUNCT,IDESC,IEND
  112.       COMMON      /LUNIT/ PMS,POF,PDF
  113.       DATA E/'E'/,O/'O'/,T/'T'/,P/'P'/,B/'B'/,D/'D'/,
  114.      .     H/'H'/,S/'S'/,L/'L'/,N/'N'/,Q/'Q'/,U/'U'/,F/'F'/
  115.       DATA BB/'B'/,CC/'C'/,DD/'D'/,EE/'E'/,FF/'F'/,II/'I'/,NN/'N'/,
  116.      .     OO/'O'/,PP/'P'/,RR/'R'/,SS/'S'/,TT/'T'/,UU/'U'/,AA/'A'/,
  117.      .     LL/'L'/
  118. C
  119. C
  120.       RPD = 2 
  121.       ROC = 5
  122.       POF = 9
  123.       PDF = 9
  124.       PMS = 9
  125.       IFUNCT = 0
  126.       IDESC = 0
  127. C
  128.       LSAME = .FALSE.
  129.       LACT = .FALSE.
  130.       LOPERR = .FALSE.
  131.       LHEAD = .TRUE.
  132. C
  133. C read in the first 4 lines of the pal design spec
  134. C
  135. C
  136. C read the command line arg
  137.       Call args(cmdline)
  138.       filename = cmdline
  139.       len = index(cmdline,' ')
  140.       filename(len:) = '.pal'
  141.       PRINT*,'This Program is in the Public Domain'
  142.       PRINT*,'Reading file ',filename
  143. C
  144.       OPEN(UNIT=2,FILE=filename,STATUS='old')
  145.       READ(RPD,10) IPAL,INAME,REST,PATNUM,TITLE,COMP
  146.    10 FORMAT(3A1,5A1,72A1,/,80A1,/,80A1,/,80A1)
  147. C
  148. C read in the pin list (line 5) through the end of the pal design
  149. C specification
  150. C
  151.       DO (J=1,200)
  152.       READ(RPD,11,END=16) (IPAGE(I,J),I=1,80)
  153.    11 FORMAT(80A1)
  154. C
  155. C check for 'FUNCTION TABLE'and save the line number
  156. C
  157.       IF( IFUNCT.EQ.0 .AND. IPAGE(1,J).EQ.FF.AND.
  158.      .    IPAGE(2,J).EQ.UU.AND.IPAGE(3,J).EQ.NN.AND.
  159.      .    IPAGE(4,J).EQ.CC.AND.IPAGE(5,J).EQ.TT.AND.
  160.      .    IPAGE(6,J).EQ.II.AND.IPAGE(7,J).EQ.OO.AND.
  161.      .    IPAGE(8,J).EQ.NN.AND.IPAGE(10,J).EQ.TT.AND.
  162.      .    IPAGE(11,J).EQ.AA.AND.IPAGE(12,J).EQ.BB.AND.
  163.      .    IPAGE(13,J).EQ.LL.AND.IPAGE(14,J).EQ.EE)IFUNCT=J
  164.  
  165. C
  166. C check for 'DESCRIPTION' and save the line number
  167. C
  168.       IF( IDESC.EQ.0 .AND. IPAGE(1,J).EQ.DD.AND.
  169.      .    IPAGE(2,J).EQ.EE.AND.IPAGE(3,J).EQ.SS.AND.
  170.      .    IPAGE(4,J).EQ.CC.AND.IPAGE(5,J).EQ.RR.AND.
  171.      .    IPAGE(6,J).EQ.II.AND.IPAGE(7,J).EQ.PP.AND.
  172.      .    IPAGE(8,J).EQ.TT.AND.IPAGE(9,J).EQ.II.AND.
  173.      .    IPAGE(10,J).EQ.OO.AND.IPAGE(11,J).EQ.NN) IDESC=J
  174.       REPEAT
  175. C
  176. C save the last line number of the pal design spec
  177. C
  178.    16 IEND = J-1
  179.       CLOSE(2)
  180.       CALL INITLZ(INAME,ITYPE,LFUSES,IC,IL,IBLOW,LPROD)
  181. C
  182. C print error message for invalid pal part type
  183. C
  184.       IF(ITYPE.NE.0) GO TO 17
  185.       WRITE(PMS,18) IPAL,INAME
  186.    18 FORMAT(/,' PAL PART TYPE "',3A1,5A1,'" IS INCORRECT')
  187.       STOP
  188. C
  189. C get 24 pin names
  190. C
  191.    17 DO (J=1,24)
  192.            CALL GETSYM(LPHASE,ISYM,J,IC,IL)
  193.       REPEAT
  194.       IF(.NOT.(LEQUAL.OR.LLEFT.OR.LAND.OR.LOR.OR.LRIGHT)) GO TO 24
  195.       WRITE(PMS,23)
  196.    23 FORMAT(/,' LESS THAN 24 PIN NAMES IN THE PIN LIST')
  197.       STOP
  198.    24 ILE = IL
  199.    25 CALL GETSYM(LBUF,IBUF,1,IC,IL)
  200.    28 IF(.NOT.LEQUAL) GO TO 25
  201.          ILL = IL
  202.       CALL MATCH(IMATCH,IBUF,ISYM)
  203.       IF(IMATCH.EQ.0) GO TO 100
  204. C
  205. C check for valid polarity (active low)
  206. C
  207.       LSAME = ((LPHASE(IMATCH)).AND.(LBUF(1)).OR.
  208.      .        (.NOT.LPHASE(IMATCH)).AND.(.NOT.LBUF(1)))
  209.       IF(ITYPE.NE.6.AND.(LSAME)) LACT = .TRUE.
  210. C
  211. C check for valid output pin
  212. C
  213.    29 IF((ITYPE.EQ.1.OR.ITYPE.EQ.7.OR.ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.
  214.      .   ITYPE.EQ.10).AND.(IMATCH.LT.14.OR.IMATCH.GT.23))
  215.      .   LOPERR = .TRUE.
  216.       IF((ITYPE.EQ.2.OR.ITYPE.EQ.11.OR.ITYPE.EQ.12.OR.ITYPE.EQ.13
  217.      .   .OR.ITYPE.EQ.14).AND.(IMATCH.LT.15.OR.IMATCH.GT.22))
  218.      .   LOPERR = .TRUE.
  219.       IF(ITYPE.EQ.3.AND.(IMATCH.LT.16.OR.IMATCH.GT.21))
  220.      .   LOPERR = .TRUE.
  221.       IF(ITYPE.EQ.4.AND.(IMATCH.LT.17.OR.IMATCH.GT.20))
  222.      .   LOPERR = .TRUE.
  223.       IF((ITYPE.EQ.5.OR.ITYPE.EQ.6).AND.(IMATCH.LT.18.OR.IMATCH.GT.19))
  224.      .   LOPERR = .TRUE.
  225.       IF((LACT).OR.(LOPERR)) GO TO 100
  226.       I88PRO = (23-IMATCH)*8+1
  227. C
  228. C start PAL20C1 on product line 33
  229. C
  230.       IF(INAME(3).EQ.C) I88PRO = 33
  231.       IC = 0
  232.    30 CALL INCR(IC,IL)
  233.          IF(.NOT.(LEQUAL.OR.LLEFT)) GO TO 30
  234.       LPROD(I88PRO) = .TRUE.
  235.       IF(.NOT.LLEFT) CALL SLIP(LFUSES,I88PRO,ITYPE,IBLOW)
  236.       DO(I8PRO = 1,16)
  237.             IPROD = I88PRO+I8PRO-1
  238.             LPROD(IPROD) = .TRUE.
  239.             LFIRST = .TRUE.
  240.    50         ILL = IL
  241.                CALL GETSYM (LBUF,IBUF,1,IC,IL)
  242.             CALL MATCH(IMATCH,IBUF,ISYM)
  243.             IF(IMATCH.EQ.0) GO TO 100
  244.             IF(IMATCH.EQ.12) GO TO 64
  245.             IF(.NOT.LFIRST) GO TO 58
  246.                 LFIRST = .FALSE.
  247.                 DO (I=1,40)
  248.                     IBLOW = IBLOW+1
  249.                     LFUSES(I,IPROD) = .TRUE.
  250.                 REPEAT
  251.    58 CALL IXLATE(IINPUT,LPHASE,IMATCH,LBUF,ITYPE)
  252.       IF(IINPUT.LE.0) GO TO 60
  253.       IBLOW = IBLOW-1
  254.       LFUSES(IINPUT,IPROD) = .FALSE.
  255.       CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,.FALSE.,ITYPE,
  256.      .             LPROD,IOP,IBLOW,I88PRO,I8PRO,cmdline)
  257.    60 IF(LAND) GO TO 50
  258.    64 IF(.NOT.LRIGHT) GO TO 68
  259.    66 CALL INCR(IC,IL)
  260.       IF(.NOT.LEQUAL) GO TO 66
  261.    68 IF(.NOT.(LOR.OR.LEQUAL)) GO TO 74
  262.       REPEAT
  263.    74 ILL = IL
  264.       CALL GETSYM(LBUF,IBUF,1,IC,IL)
  265.       IF(LLEFT.OR.LEQUAL) GO TO 28
  266.   100 IF(ILL.EQ.IFUNCT.OR.ILL.EQ.IDESC.OR.ILL.EQ.IEND) GO TO 104
  267. C
  268. C error message for unrecognizable symbol
  269. C
  270.       ILERR = ILL+4
  271.       WRITE(PMS,101) (IBUF(I,1),I=1,8),ILERR,(IPAGE(I,ILL),I=1,80)
  272.   101 FORMAT(/,' ERROR SYMBOL = ',8A1,' IN LINE NUMBER ',I3,
  273.      .       /, ' ',80A1)
  274. C
  275. C error message for active high/low errors
  276. C
  277.       IF((LACT).AND.(.NOT.LOPERR)) WRITE(PMS,102) IPAL,INAME
  278.   102 FORMAT(' OUTPUT MUST BE INVERTED SINCE ',3A1,5A1,
  279.      .        ' IS AN ACTIVE LOW DEVICE')
  280. C
  281. C error message for invalid output pin
  282. C
  283.       IF((LOPERR).AND.IMATCH.NE.0) WRITE(PMS,103)IMATCH,IPAL,INAME
  284.   103 FORMAT(' THIS PIN, NUMBER ',I2,' IS AN INVALID OUTPUT PIN',
  285.      .       ' FOR ',3A1,5A1)
  286.       STOP
  287.   104 CALL TWEEK(ITYPE,LFUSES)
  288. C
  289. C print optional header
  290. C
  291.       PRINT*,'APALASM24 by Bob Metzler                   Version 1.00'
  292.   105 IF(LHEAD) WRITE(PMS,106)
  293.   106 FORMAT(/,' THIS PALASM AIDS THE USER IN THE DESIGN AND'
  294.      .     ' PROGRAMMING OF THE',/,' SERIES 24 PAL FAMILY. THE',
  295.      .    ' FOLLOWING OPTIONS ARE PROVIDED:',
  296.      .     //,'     ECHO(E)      - PRINTS THE PAL DESIGN',
  297.      .    ' SPECIFICATION',
  298.      .     /,'     PIN OUT(O)   - PRINTS THE PIN OUT OF THE PAL',
  299.      .     /,'     SIMULATE(T)  - EXERCISES THE FUNCTION TABLE',
  300.      .    ' VECTORS IN LOGIC',/,'                    EQUATIONS',
  301.      .      ' AND GENERATES TEST VECTORS',
  302.      .     /,'     PLOT(P)      - PRINTS THE ENTIRE FUSE PLOT',
  303.      .     /,'     BRIEF(B)     - PRINTS ONLY THE USED PRODUCT LINES',
  304.      .      ' OF THE FUSE PLOT',/,'                    PHANTOM',
  305.      .      ' FUSES ARE OMITTED'
  306.      .     /,'     DATA I/O(D)  - GENERATES FUSE OUTPUT FOR DATA I/O',
  307.      .    ' PROGRAMMERS',
  308.      .     /,'     QUIT(Q)      - EXITS PALASM')
  309. C
  310. C    .     /,'     HEX(H)       - GENERATES HEX OUTPUT FOR PAPER TAPE',
  311. C    .     /,'     SHORT(S)     - GENERATES HEX OUTPUT FOR PAPER TAPE',
  312. C    .     /,'     BHLF(L)      - GENERATES BHLF OUTPUT FOR PAPER TAPE',
  313. C    .     /,'     BNPF(N)      - GENERATES BNPF OUTPUT FOR PAPER TAPE',
  314. C
  315.   107 WRITE(PMS,108)
  316.   108 FORMAT(/,' OPERATION CODES:')
  317.       WRITE(PMS,109)
  318.   109 FORMAT(/,' E=ECHO INPUT O=PIN OUT T=SIMULATE P=PLOT B=BRIEF',
  319.      .      /,' D=DATA I/O Q=QUIT')
  320. C
  321. C    .      /,' D=DATA I/O H=HEX S=SHORT L=BHLF N=BNPF Q=QUIT')
  322. C
  323.       WRITE(PMS,110)
  324.   110 FORMAT(/,' ENTER OPERATION CODE:')
  325.         READ(*,120) IOP
  326.   120 FORMAT(A1)
  327. C     call IODC2
  328.       IF(IOP.EQ.E) CALL ECHO(IPAL,INAME,REST,PATNUM,TITLE,COMP,
  329.      .                       cmdline)
  330.       IF(IOP.EQ.O) CALL PINOUT(IPAL,INAME,TITLE,cmdline)
  331.       IF(IOP.EQ.T) CALL TEST(LPHASE,LBUF,TITLE,IC,IL,
  332.      .                       ILE,ISYM,IBUF,ITYPE,cmdline)
  333.       IF(IOP.EQ.P) CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,
  334.      .                      .TRUE.,ITYPE,LPROD,IOP,IBLOW,I88PRO,
  335.      .                      I8PRO,cmdline)
  336.       IF(IOP.EQ.B) CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,
  337.      .                      .TRUE.,ITYPE,LPROD,IOP,IBLOW,I88PRO,
  338.      .                      I8PRO,cmdline)
  339.       IF(IOP.EQ.D) CALL PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,
  340.      .                      .TRUE.,ITYPE,LPROD,IOP,IBLOW,I88PRO,
  341.      .                      I8PRO,cmdline)
  342.       IF(IOP.EQ.H) CALL HEX(LFUSES,H,cmdline)
  343.       IF(IOP.EQ.S) CALL HEX(LFUSES,S,cmdline)
  344.       IF(IOP.EQ.L) CALL BINR(LFUSES,H,L)
  345.       IF(IOP.EQ.N) CALL BINR(LFUSES,P,N)
  346. C     call IODC4
  347.       IF(IOP.NE.Q) GO TO 107
  348.       STOP
  349.       END
  350. C
  351. C ********************************************************
  352. C
  353.       SUBROUTINE INITLZ(INAME,ITYPE,LFUSES,IC,IL,IBLOW,LPROD)
  354. C
  355. C This subroutine initializes variables and matches pal part
  356. C number with ITYPE
  357. C
  358.       IMPLICIT NONE
  359.       INTEGER INAME(5),INFO(6,14),ITYPE,IC,IL,IBLOW,IPAGE,I,J
  360.       LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,
  361.      .        LFUSES(40,80),LMATCH,LXOR,LPROD(80)
  362.       COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  363.       COMMON /PGE/ IPAGE(80,200)
  364.       DATA INFO/
  365.      . '1','2','L','1','0',1,
  366.      . '1','4','L','8',' ',2,
  367.      . '1','6','L','6',' ',3,
  368.      . '1','8','L','4',' ',4,
  369.      . '2','0','L','2',' ',5,
  370.      . '2','0','C','1',' ',6,
  371.      . '2','0','L','1','0',7,
  372.      . '2','0','X','1','0',8,
  373.      . '2','0','X','8',' ',9,
  374.      . '2','0','X','4',' ',10,
  375.      . '2','0','L','8',' ',11,
  376.      . '2','0','R','8',' ',12,
  377.      . '2','0','R','6',' ',13,
  378.      . '2','0','R','4',' ',14/
  379. C
  380. C initialize LFUSES array (fuse array)
  381. C
  382.       DO (J=1,80)
  383.             DO (I=1,40)
  384.                 LFUSES(I,J)=.FALSE.
  385.             REPEAT
  386.               LPROD(J)=.FALSE.
  387.       REPEAT
  388. C
  389. C initialize IBLOW (number of fuses blown)
  390. C
  391.       IBLOW = 0
  392. C
  393. C initialize IC and IL (column and line pointers)
  394. C
  395.       IC = 0
  396.       IL = 1
  397. C
  398. C initialize ITYPE (pal part type)
  399. C
  400.       ITYPE = 0
  401. C
  402. C ITYPE is assigned the following values for each of the pal types
  403. C PAL12L10 = 1 PAL14L8 = 2 PAL16L6 = 3 PAL18L4 = 4
  404. C PAL20L2 = 5 PAL20C1 = 6 PAL20L10 = 7 PAL20X10 =8 
  405. C PAL20X8 = 9 PAL20X4 = 10 PAL20L8 = 11 PAL20R8 =12
  406. C PAL20R6 = 13 PAL20R4 = 14
  407. C
  408.       DO (J=1,14)
  409.         LMATCH =.TRUE.
  410.         DO (I=1,4)
  411.             IF(INAME(I).NE.INFO(I,J)) LMATCH = .FALSE.
  412.         REPEAT
  413.         IF(LMATCH) ITYPE = INFO(6,J)
  414.         IF(LMATCH) go to 50
  415.       REPEAT
  416.       IF(ITYPE.EQ.0) RETURN
  417.    50 CALL INCR(IC,IL)
  418.       RETURN
  419.       END
  420. C
  421. C ********************************************************
  422. C
  423.       SUBROUTINE GETSYM(LPHASE,ISYM,J,IC,IL)
  424. C
  425. C This routine gets the PIN NAME, /if complement logic, and
  426. C the following operation symbol if any
  427. C
  428.       IMPLICIT NONE
  429.       INTEGER ISYM(8,24),IPAGE(80,200),IBLANK,IC,IL,I,J
  430.       LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,
  431.      .        LXOR,LPHASE(24)
  432.       COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  433.       COMMON /PGE/ IPAGE(80,200)
  434.       DATA IBLANK/' '/
  435.       IF( .NOT.(LLEFT.OR.LAND.OR.LOR.OR.LEQUAL.OR.LRIGHT)) GO TO 10
  436.       CALL INCR(IC,IL)
  437.    10 LPHASE(J) = (.NOT.LSLASH)
  438.       IF(LPHASE(J)) GO TO 15
  439.       CALL INCR(IC,IL)
  440.    15 DO (I=1,8)
  441.           ISYM(I,J) = IBLANK
  442.       REPEAT
  443.    25 DO (I=1,7)
  444.           ISYM(I,J) = ISYM(I+1,J)
  445.       REPEAT
  446.       ISYM(8,J) = IPAGE(IC,IL)
  447.       CALL INCR(IC,IL)
  448.       IF( LLEFT.OR.LBLANK.OR.LAND.OR.LOR.OR.LRIGHT.OR.LEQUAL) RETURN
  449.       GO TO 25
  450.       END
  451. C
  452. C ********************************************************
  453. C
  454.       SUBROUTINE INCR(IC,IL)
  455. C
  456. C This subroutine increments column and line pointers
  457. C blanks and characters after ';' are ignored
  458. C
  459.       IMPLICIT NONE
  460.       INTEGER ISYM(8,24),IPAGE(80,200),IBLANK,IC,IL,PMS,
  461.      .        POF,PDF,ILEFT,IAND,IOR,COMMENT,ISLASH,IEQUAL,
  462.      .        IRIGHT,ICOLON
  463.       LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,
  464.      .        LXOR,LXOR1
  465.       COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  466.       COMMON /PGE/ IPAGE(80,200)
  467.       COMMON /LUNIT/ PMS,POF,PDF
  468.       DATA IBLANK/' '/,ILEFT/'('/,IAND/'*'/,IOR/'+'/,COMMENT/';'/,
  469.      .     ISLASH/'/'/,IEQUAL/'='/,IRIGHT/')'/,ICOLON/':'/
  470.       LBLANK = .FALSE.
  471.       LXOR = .FALSE.
  472.       LXOR1 = .FALSE.
  473.    10 IC = IC+1
  474.       IF(IC.LE.79.AND.IPAGE(IC,IL).NE.COMMENT) GO TO 30
  475.       IL = IL+1
  476.       IF(IL.LE.200) GO TO 20
  477.       WRITE(PMS,15)
  478.    15 FORMAT(/,' SOURCE FILE EXCEEDS 200 LINES')
  479.       STOP
  480.    20 IC = 0
  481.       GO TO 10
  482.    30 IF(IPAGE(IC,IL).NE.IBLANK) GO TO 31
  483.       LBLANK = .TRUE.
  484.       GO TO 10
  485.    31 IF(IPAGE(IC,IL).NE.ICOLON) GO TO 33
  486.       IF(LXOR) GO TO 32
  487.       LXOR1 = .TRUE.
  488.       GO TO 10
  489.    32 LOR = .TRUE.
  490.       RETURN
  491.    33 IF( .NOT.(IPAGE(IC,IL).EQ.IOR.AND.(LXOR1)) ) GO TO 34
  492.       LXOR = .TRUE.
  493.       GO TO 10
  494.    34 LLEFT = (IPAGE(IC,IL).EQ.ILEFT)
  495.       LAND = (IPAGE(IC,IL).EQ.IAND)
  496.       LOR = (IPAGE(IC,IL).EQ.IOR)
  497.       LSLASH = (IPAGE(IC,IL).EQ.ISLASH)
  498.       LEQUAL = (IPAGE(IC,IL).EQ.IEQUAL)
  499.       LRIGHT = (IPAGE(IC,IL).EQ.IRIGHT)
  500.       RETURN
  501.       END
  502. C
  503. C ********************************************************
  504. C
  505.       SUBROUTINE MATCH(IMATCH,IBUF,ISYM)
  506. C
  507. C This subroutine finds a match between the pin name in the equation
  508. C and the pin name in the pin list or function table pin list
  509. C
  510.       IMPLICIT NONE
  511.       INTEGER IBUF(8,24),ISYM(8,24),IMATCH,I,J
  512.       LOGICAL LMATCH
  513.       IMATCH = 0
  514.       DO (J=1,24)
  515.           LMATCH = .TRUE.
  516.           DO (I=1,8)
  517.               LMATCH = LMATCH.AND.(IBUF(I,1).EQ.ISYM(I,J))
  518.           REPEAT
  519.           IF(LMATCH) IMATCH = J
  520.       REPEAT
  521.       RETURN
  522.       END
  523. C
  524. C ********************************************************
  525. C
  526.       SUBROUTINE IXLATE(IINPUT,LPHASE,IMATCH,LBUF,ITYPE)
  527. C
  528. C This subroutine finds a match between input pin number and
  529. C the input line number for a specific pal, add 1 the the input
  530. C line number if the pin is a complement
  531. C
  532.       IMPLICIT NONE
  533.       INTEGER ITABLE(24,14),IINPUT,IMATCH,ITYPE,IBUBL
  534.       LOGICAL LPHASE(24),LBUF(24)
  535.       DATA    ITABLE/
  536.      .3,1,5,9,13,17,21,25,29,33,37,0,39,0,0,0,0,0,0,0,0,0,0,0,
  537.      .3,1,5,9,13,17,21,25,29,33,37,0,39,35,0,0,0,0,0,0,0,0,7,0,
  538.      .3,1,5,9,13,17,21,25,29,33,37,0,39,35,31,0,0,0,0,0,0,11,7,0,
  539.      .3,1,5,9,13,17,21,25,29,33,37,0,39,35,31,27,0,0,0,0,15,11,7,0,
  540.      .3,1,5,9,13,17,21,25,29,33,37,0,39,35,31,27,23,0,0,19,15,11,7,0,
  541.      .3,1,5,9,13,17,21,25,29,33,37,0,39,35,31,27,23,0,0,19,15,11,7,0,
  542.      .3,1,5,9,13,17,21,25,29,33,37,0,39,0,35,31,27,23,19,15,11,7,0,0,
  543.      .0,1,5,9,13,17,21,25,29,33,37,0,0,39,35,31,27,23,19,15,11,7,3,0,
  544.      .0,1,5,9,13,17,21,25,29,33,37,0,0,39,35,31,27,23,19,15,11,7,3,0,
  545.      .0,1,5,9,13,17,21,25,29,33,37,0,0,39,35,31,27,23,19,15,11,7,3,0,
  546.      .3,1,5,9,13,17,21,25,29,33,37,0,39,35,0,31,27,23,19,15,11,0,7,0,
  547.      .0,1,5,9,13,17,21,25,29,33,37,0,0,39,35,31,27,23,19,15,11,7,3,0,
  548.      .0,1,5,9,13,17,21,25,29,33,37,0,0,39,35,31,27,23,19,15,11,7,3,0,
  549.      .0,1,5,9,13,17,21,25,29,33,37,0,0,39,35,31,27,23,19,15,11,7,3,0/
  550.       IBUBL=0
  551.       IF( (( LPHASE(IMATCH)).AND.(.NOT.LBUF(1))).OR.
  552.      .    (( .NOT.LPHASE(IMATCH)).AND.(LBUF(1))) ) IBUBL=1
  553.       IINPUT=ITABLE(IMATCH,ITYPE)+IBUBL
  554.       RETURN
  555.       END
  556. C
  557. C ********************************************************
  558. C
  559.       SUBROUTINE ECHO(IPAL,INAME,REST,PATNUM,TITLE,COMP,cmdline)
  560. C this subroutine prints the pal design specification input file
  561. C
  562.       IMPLICIT NONE
  563.       INTEGER IPAL(3),INAME(5),REST(72),PATNUM(80),TITLE(80),
  564.      .        COMP(80),IPAGE(80,200),IFUNCT,IDESC,IEND,
  565.      .        PMS,POF,PDF,LEN,I,J
  566.       CHARACTER cmdline*20,echoname*25
  567.       COMMON /PGE/ IPAGE(80,200)
  568.       COMMON /LUNIT/ PMS,POF,PDF
  569.       COMMON /FTEST/ IFUNCT,IDESC,IEND
  570. C
  571.       echoname = cmdline
  572.       len = index(cmdline,' ')
  573.       echoname(len:) = '.src'
  574.       PRINT*,'Writing file ',echoname
  575.       OPEN(UNIT=7,FILE=echoname,STATUS='new')
  576. C
  577.       WRITE(7,10) IPAL,INAME,REST,PATNUM,TITLE,COMP
  578.   10  FORMAT(/,' ',3A1,5A1,72A1,/,' ',80A1,/,' ',80A1)
  579.       DO (J=1,IEND)
  580.           WRITE(7,20) (IPAGE(I,J),I=1,80)
  581.   20    FORMAT(' ',80A1)
  582.       REPEAT
  583.       CLOSE(7)
  584.       RETURN
  585.       END
  586. C
  587. C ********************************************************
  588. C
  589.       SUBROUTINE PINOUT(IPAL,INAME,TITLE,cmdline)
  590. C
  591. C this subroutine prints the pin out of the pal
  592. C
  593.       IMPLICIT NONE
  594.       INTEGER IPAL(3),INAME(5),TITLE(80),PIN(8,24),IIN(8,2),
  595.      .        IPAGE(80,200),IBLANK,ISTAR,LEN,PMS,POF,PDF,
  596.      .        I,J,IL,IC,II,JJ
  597.       CHARACTER cmdline*20,pinname*25
  598.       COMMON /PGE/ IPAGE(80,200)
  599.       COMMON /LUNIT/ PMS,POF,PDF
  600.       DATA IBLANK/' '/,ISTAR/'*'/
  601. C
  602.       pinname = cmdline
  603.       len = index(cmdline,' ')
  604.       pinname(len:) = '.pins'
  605.       PRINT*,'Writing file ',pinname
  606.       OPEN(UNIT=8,FILE=pinname,STATUS='new')
  607. C
  608.       DO (J=1,24)
  609.           DO (I=1,8)
  610.             PIN(I,J)=IBLANK
  611.         REPEAT
  612.       REPEAT
  613.       DO (J=1,2)
  614.           DO (I=1,8)
  615.             IIN(I,J)=IBLANK
  616.         REPEAT
  617.       REPEAT
  618.       IIN(2,1)=IPAL(1)
  619.       IIN(4,1)=IPAL(2)
  620.       IIN(6,1)=IPAL(3)
  621.       IIN(1,2)=INAME(1)
  622.       IIN(3,2)=INAME(2)
  623.       IIN(5,2)=INAME(3)
  624.       IIN(7,2)=INAME(4)
  625.       IIN(8,2)=INAME(5)
  626.       J=0
  627.       IL=0
  628.   30  IC=0
  629.       IL=IL+1
  630.   35  IC=IC+1
  631.   40  IF( IC.GT.80) GO TO 30
  632.       IF( IPAGE(IC,IL).EQ.IBLANK) GO TO 35
  633.       J=J+1
  634.       IF(J.GT.24) GO TO 60
  635.       DO (I=1,8)
  636.           PIN(I,J)=IPAGE(IC,IL)
  637.         IC=IC+1
  638.         IF(IC.GT.80) GO TO 40
  639.         IF(IPAGE(IC,IL).EQ.IBLANK) GO TO 40
  640.       REPEAT
  641.   60  DO(J=1,12)
  642.           II=0
  643.   65    II=II+1
  644.         IF(II.EQ.9) GO TO 75
  645.         IF(PIN(II,J).NE.IBLANK) GO TO 65
  646.         I=9
  647.   70    I=I-1
  648.         II=II-1
  649.         PIN(I,J)=PIN(II,J)
  650.         PIN(II,J)=IBLANK
  651.         IF(II.NE.1) GO TO 70
  652.   75  REPEAT
  653.       WRITE(8,76) TITLE
  654.   76  FORMAT(/,' ',80A1)
  655.       WRITE(8,78) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
  656.      .              ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
  657.      .              ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
  658.      .              ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
  659.   78  FORMAT(/,' ',14X,14A1,3X,14A1,
  660.      .       /,' ',14X,A1,13X,A1,1X,A1,13X,A1)
  661.       JJ=24
  662.       DO(J=1,12)
  663.           WRITE(8,80) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
  664.   80    FORMAT(' ',11X,4A1,29X,4A1)
  665.         WRITE(8,81) (PIN(I,J),I=1,8), ISTAR,J,
  666.      .       (IIN(I,1),I=1,8),JJ,ISTAR,(PIN(I,JJ),I=1,8)
  667.   81    FORMAT(' ',8A1,3X,A1,I2,' ',11X,8A1,10X,' ',I2,A1,3X,8A1)
  668.           WRITE(8,82) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
  669.   82    FORMAT(' ',11X,4A1,29X,4A1)
  670.         WRITE(8,84) ISTAR,(IIN(I,2),I=1,8),ISTAR
  671.   84    FORMAT(' ',14X,A1,11X,8A1,10X,A1)
  672.         DO(II=1,2)
  673.             DO(I=1,8)
  674.                 IIN(I,II)=IBLANK
  675.             REPEAT
  676.         REPEAT
  677.         JJ=JJ-1
  678.       REPEAT
  679.       WRITE(8,90) ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
  680.      .              ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
  681.      .              ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,
  682.      .              ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR,ISTAR
  683.   90  FORMAT(' ',14X,31A1)
  684.       CLOSE(8)
  685.       RETURN
  686.       END
  687. C
  688. C ********************************************************
  689. C
  690.       SUBROUTINE PLOT(LBUF,IBUF,LFUSES,IPROD,TITLE,LDUMP,ITYPE,LPROD,
  691.      .                 IOP,IBLOW,I88PRO,I8PRO,cmdline)
  692. C
  693. C this subroutine produces the fuse plot
  694. C
  695.       IMPLICIT NONE
  696.       INTEGER IBUF(8,24),IOUT(64),ISAVE(80,40),TITLE(80),
  697.      .     IPROD,ITYPE,IOP,IBLOW,I88PRO,I8PRO,PMS,POF,PDF,IAND,
  698.      .     IOR,ISLASH,IDASH,X,IBLANK,P,B,D,ZERO,ONE,FX,FIDASH,
  699.      .     I,J,LEN,K,IDATA(40)
  700.       LOGICAL LBUF(24),LFUSES(40,80),LDUMP,LPROD(80)
  701.       CHARACTER cmdline*20,plotname*25,STX,ETX
  702.       PARAMETER (STX=2,ETX=3)
  703.       COMMON /LUNIT/ PMS,POF,PDF
  704.       DATA ISAVE/3200*' '/,IAND/'*'/,IOR/'+'/,ISLASH/'/'/,
  705.      .     IDASH/'-'/,X/'X'/,IBLANK/' '/,P/'P'/,B/'B'/,
  706.      .     D/'D'/,ZERO/'0'/,ONE/'1'/,FX/'0'/,FIDASH/'0'/
  707. C
  708.       IF(LDUMP) GO TO 58
  709.       IF(ISAVE(IPROD,1).NE.IBLANK) RETURN
  710.       IF(LBUF(1)) GO TO 5
  711.       DO(J=1,39)
  712.           ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
  713.       REPEAT
  714.       ISAVE(IPROD,40)=ISLASH
  715.   5   DO(I=1,8)
  716.           IF(ISAVE(IPROD,1).NE.IBLANK) RETURN
  717.         IF(IBUF(I,1).EQ.IBLANK) GO TO 20
  718.         DO(J=1,39)
  719.             ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
  720.         REPEAT
  721.         ISAVE(IPROD,40)=IBUF(I,1)
  722.   20  REPEAT
  723.       IF(ISAVE(IPROD,1).NE.IBLANK) RETURN
  724.       DO(J=1,39)
  725.           ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
  726.       REPEAT
  727.       ISAVE(IPROD,40)=IAND
  728.       RETURN
  729. C
  730. C print fuse plot
  731. C
  732.   58  plotname = cmdline
  733.       len = index(cmdline,' ')
  734. C
  735.       IF(IOP.EQ.D) THEN
  736.           plotname(len:) = '.jed'
  737.         GO TO 60
  738.       ELSE IF(IOP.EQ.B) THEN
  739.           plotname(len:) = '.brf'
  740.         GO TO 60
  741.       ELSE 
  742.           plotname(len:) = '.plt'
  743.       ENDIF
  744. C
  745.   60  PRINT*,'Writing file ',plotname
  746.       OPEN(UNIT=1,FILE=plotname,STATUS='new')
  747. C
  748.       IF(IOP.EQ.D) GO TO 62
  749.       WRITE(1,61) TITLE
  750.   61  FORMAT(/,' ',80A1,//,
  751.      . '                11 1111 1111 2222 2222 2233 3333 3333',/,
  752.      . '    0123 4567 8901 2345 6789 0123 4567 8901 2345 6789',/)
  753.       GO TO 64
  754. C
  755. C STX determines the starting character for DATA I/O format
  756. C
  757.   62  WRITE(1,63) STX
  758.   63  FORMAT(' ',A1,/,'*L0000'/)
  759.   64  DO(I88PRO=1,73,8)
  760.           DO(I8PRO=1,8)
  761.             IPROD=I88PRO+I8PRO-1
  762.             ISAVE(IPROD,40)=IBLANK
  763.             DO(I=1,40)
  764.                 IF(ISAVE(IPROD,1).NE.IBLANK) GO TO 70
  765.                 DO(J=1,39)
  766.                     ISAVE(IPROD,J)=ISAVE(IPROD,J+1)
  767.                 REPEAT
  768.                 ISAVE(IPROD,40)=IBLANK
  769.   70        REPEAT
  770.             DO(I=1,24)
  771.                 IOUT(I+40)=ISAVE(IPROD,I)
  772.             REPEAT
  773.             IF(ISAVE(IPROD,25).NE.IBLANK) IOUT(64)=IDASH
  774.             DO(I=1,40)
  775.                 IOUT(I)=X
  776.                 IF(LFUSES(I,IPROD)) IOUT(I)=IDASH
  777.             REPEAT
  778.             CALL FANTOM(ITYPE,IOP,IOUT,IPROD,I8PRO)
  779.             IF(IOP.NE.D) GO TO 86
  780.             K=0
  781.   81        DO(I=1,40)
  782.         IF((IOUT(I).EQ.FX).OR.(IOUT(I).EQ.FIDASH)) GO TO 82
  783.                 K=K+1
  784.                 IF(IOUT(I).EQ.X) IDATA(K)=ZERO
  785.                 IF(IOUT(I).EQ.IDASH) IDATA(K)=ONE
  786.   82        REPEAT
  787.             DO(I=1,40)
  788.         IF((IOUT(I).EQ.X).OR.(IOUT(I).EQ.IDASH)) GO TO 84
  789.             REPEAT
  790.             GO TO 94
  791.   84        WRITE(1,85) IDATA
  792.   85        FORMAT(' ',40(A1))
  793.             GO TO 94
  794.   86        IPROD=IPROD-1
  795.             IF((IOP.EQ.P).OR.((IOP.EQ.B).AND.(LPROD(IPROD+1))))
  796.      .      WRITE(1,90) IPROD,IOUT
  797.   90        FORMAT(' ',I2,10(' ',4A1),' ',24A1)
  798.   94    REPEAT
  799.         WRITE(1,96)
  800.   96    FORMAT(1X)
  801.   100 REPEAT
  802.       IF(IOP.NE.D) GO TO 105
  803.       WRITE(1,101) ETX
  804.   101 FORMAT('*',A1,'0000')
  805.       CLOSE(1)
  806.       RETURN
  807.   105 WRITE(1,110)
  808.   110 FORMAT(/,
  809.      .' LEGEND:  X : FUSE NOT BLOWN (L,N,0) - : FUSE BLOWN (H,P,1)')
  810.       IF(IOP.EQ.P) WRITE(1,111)
  811.   111 FORMAT(
  812.      .'          - : PHANTOM FUSE (L,N,0)   - : PHANTOM FUSE (H,P,1)')
  813.       WRITE(1,112) IBLOW
  814.   112 FORMAT(/,' NUMBER OF FUSES BLOWN = ',I4)
  815.       WRITE(1,113)
  816.   113 FORMAT(//)
  817.       CLOSE(1)
  818.       RETURN
  819.       END
  820. C
  821. C ********************************************************
  822. C
  823.       SUBROUTINE HEX(LFUSES,IOP,cmdline)
  824. C
  825. C this subroutine generates hex programming formats
  826. C
  827.       IMPLICIT NONE
  828.       INTEGER ITEMP(80),ITABLE(32),IOP,PMS,POF,PDF,H,S,LEN,
  829.      .     I,INC,IPROD,J,IINPUT,IHEX
  830.       LOGICAL LFUSES(40,80)
  831.       CHARACTER cmdline*20,hexname*25,STX,ETX,SOH
  832.       PARAMETER (SOH=1,STX=2,ETX=3)
  833.       COMMON /LUNIT/PMS,POF,PDF
  834.       DATA H/'H'/,S/'S'/,
  835.      .     ITABLE/'00','01','02','03','04','05','06','07',
  836.      .            '08','09','0A','0B','0C','0D','0E','0F',
  837.      .            '10','11','12','13','14','15','16','17',
  838.      .            '18','19','1A','1B','1C','1D','1E','1F'/
  839. C
  840.       hexname = cmdline
  841.       len = index(cmdline,' ')
  842.       hexname(len:) = '.hex'
  843. C
  844.       PRINT*,'Writing file ',hexname
  845.       OPEN(UNIT=1,FILE=hexname,STATUS='new')
  846. C
  847. C ***** note: some prom programmers need a start character.
  848. C ***** this program outputs an stx for the DATA I/O model 9
  849. C ***** (use SOH instead of STX for model 5)
  850. C
  851.       WRITE(1,5)STX
  852.   5   FORMAT(A1)
  853.       IF(IOP.EQ.H) WRITE(1,10)
  854.   10  FORMAT(//,80(' '),//)
  855. C
  856.       DO(I=1,41,40)
  857.           INC=I-1
  858.         DO (IPROD=1,7,2)
  859.             DO(J=1,2)
  860.                 DO(IINPUT=1,40)
  861.                     IHEX=0
  862.             IF(LFUSES(IINPUT,IPROD+J-1+0+INC)) IHEX=IHEX+1
  863.             IF(LFUSES(IINPUT,IPROD+J-1+8+INC)) IHEX=IHEX+2
  864.             IF(LFUSES(IINPUT,IPROD+J-1+16+INC)) IHEX=IHEX+4
  865.             IF(LFUSES(IINPUT,IPROD+J-1+24+INC)) IHEX=IHEX+8
  866.             IF(LFUSES(IINPUT,IPROD+J-1+32+INC)) IHEX=IHEX+16
  867.             ITEMP(IINPUT+40*(J-1))=ITABLE(IHEX+1)
  868.                 REPEAT
  869.                 ITEMP(IINPUT+40*(J-1))=ITABLE(IHEX+1)
  870.             REPEAT
  871.             IF(IOP.EQ.H) WRITE(1,60)ITEMP
  872.  60         FORMAT(4(' ',20(A2,' '),'.',/))
  873.             IF(IOP.EQ.S) WRITE(1,70)
  874.         REPEAT
  875.         IF(IOP.EQ.S) WRITE(1,70)
  876.       REPEAT
  877.  61   FORMAT(4(' ',20A2,'.',/))
  878.       IF(IOP.EQ.H) WRITE(1,70)
  879.  70   FORMAT(//,80(' '),//)
  880.       WRITE(1,75)ETX
  881.  75   FORMAT(A1)
  882.       CLOSE(1)
  883.       RETURN
  884.       END
  885. C
  886. C ********************************************************
  887. C
  888.       BLOCK DATA
  889.       IMPLICIT NONE
  890.       INTEGER PR8X10(10,14),PROD8(8,11),PRODLN(40,7)
  891.       COMMON /BLK/ PR8X10(10,14),PROD8(8,11),PRODLN(40,7)
  892.       DATA PR8X10/
  893.      .       4,4,4,4,4,4,4,4,4,4,
  894.      .       3,6,5,5,5,5,5,5,6,3,
  895.      .       3,3,7,7,8,8,7,7,3,3,
  896.      .       3,3,3,9,10,10,9,3,3,3,
  897.      .       3,3,3,3,1,1,3,3,3,3,
  898.      .       3,3,3,3,1,1,3,3,3,3,
  899.      .       11,11,11,11,11,11,11,11,11,11,
  900.      .       11,11,11,11,11,11,11,11,11,11,
  901.      .       11,11,11,11,11,11,11,11,11,11,
  902.      .       11,11,11,11,11,11,11,11,11,11,
  903.      .       3,1,1,1,1,1,1,1,1,3,
  904.      .       3,1,1,1,1,1,1,1,1,3,
  905.      .       3,1,1,1,1,1,1,1,1,3,
  906.      .       3,1,1,1,1,1,1,1,1,3/
  907.       DATA PROD8/
  908.      .       1,1,1,1,1,1,1,1,
  909.      .       2,2,2,2,2,2,2,2,
  910.      .       3,3,3,3,3,3,3,3,
  911.      .       4,4,3,3,3,3,3,3,
  912.      .       5,5,3,3,3,3,3,3,
  913.      .       5,5,5,5,3,3,3,3,
  914.      .       6,6,6,6,3,3,3,3,
  915.      .       6,6,3,3,3,3,3,3,
  916.      .       7,7,7,7,7,7,3,3,
  917.      .       7,7,7,7,3,3,3,3,
  918.      .       1,1,1,1,3,3,3,3/
  919.       DATA PRODLN/
  920.      .       40*1HX,
  921.      .       40*1HP,
  922.      .       40*1HN,
  923.      .       6*1HX,2*1HP,2*1HX,2*1HP,2*1HX,2*1HP,2*1HX,
  924.      .       2*1HP,2*1HX,2*1HP,2*1HX,2*1HP,2*1HX,2*1HP,
  925.      .       2*1HX,2*1HP,4*1HX,
  926.      .       10*1HX,2*1HP,2*1HX,2*1HP,2*1HX,2*1HP,2*1HX,
  927.      .       2*1HP,2*1HX,2*1HP,2*1HX,2*1HP,8*1HX,
  928.      .       14*1HX,2*1HP,2*1HX,2*1HP,2*1HX,2*1HP,2*1HX,
  929.      .       2*1HP,12*1HX,
  930.      .       18*1HX,2*1HP,2*1HX,2*1HP,16*1HX/
  931.       END
  932. C
  933. C ********************************************************
  934. C
  935.       SUBROUTINE TWEEK(ITYPE,LFUSES)
  936. C
  937. C this subroutine tweeks the lfuses (the programming fuse plot)
  938. C for high and low phantom fuses
  939. C
  940.       IMPLICIT NONE
  941.       INTEGER ITYPE,PR8X10(10,14),PROD8(8,11),PRODLN(40,7),
  942.      .        P,N,FUSPTR,OUTPUT,GRTYPE,COL,LNTYPE,IROW
  943.       LOGICAL LFUSES(40,80),LBLANK,LLEFT,LAND,LOR,LSLASH,
  944.      .        LEQUAL,LRIGHT,LXOR
  945.       COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  946.       COMMON /BLK/ PR8X10(10,14),PROD8(8,11),PRODLN(40,7)
  947.       DATA P/'P'/,N/'N'/
  948.       FUSPTR=1
  949.       DO(OUTPUT=1,10)
  950.           GRTYPE=PR8X10(OUTPUT,ITYPE)
  951.         DO(IROW=1,8)
  952.         LNTYPE=PROD8(IROW,GRTYPE)
  953.           DO(COL=1,40)
  954.           IF(PRODLN(COL,LNTYPE).EQ.P) LFUSES(COL,FUSPTR)=.TRUE.
  955.           IF(PRODLN(COL,LNTYPE).EQ.N) LFUSES(COL,FUSPTR)=.FALSE.
  956.           REPEAT
  957.         FUSPTR=FUSPTR+1
  958.         REPEAT
  959.       REPEAT
  960.       RETURN
  961.       END
  962. C
  963. C ********************************************************
  964. C
  965.       SUBROUTINE BINR(LFUSES,H,L)
  966. C
  967. C this subroutine generates binary programming formats
  968. C
  969.       IMPLICIT NONE
  970.       INTEGER ITEMP(5,10),H,L,PMS,POF,PDF,COL,INC,
  971.      .        I,IPROD,J,K,IINPUT
  972.       LOGICAL LFUSES(40,80)
  973.       COMMON /LUNIT/ PMS,POF,PDF
  974.       WRITE(PDF,10)
  975.    10 FORMAT(//,'                                      .',//)
  976.       DO(COL=1,40,40)
  977.           INC=I-1
  978.         DO(IPROD=1,8)
  979.             DO(J=1,49,10)
  980.                 DO(K=1,10)
  981.                     IINPUT=J+K-1
  982.                     ITEMP(1,K)=L
  983.                     ITEMP(2,K)=L
  984.                     ITEMP(3,K)=L
  985.                     ITEMP(4,K)=L
  986.                     ITEMP(5,K)=L
  987.             IF(LFUSES(IINPUT,IPROD+0+INC)) ITEMP(5,K)=H
  988.             IF(LFUSES(IINPUT,IPROD+10+INC)) ITEMP(4,K)=H
  989.             IF(LFUSES(IINPUT,IPROD+20+INC)) ITEMP(3,K)=H
  990.             IF(LFUSES(IINPUT,IPROD+30+INC)) ITEMP(2,K)=H
  991.             IF(LFUSES(IINPUT,IPROD+40+INC)) ITEMP(1,K)=H
  992.                 REPEAT
  993.             WRITE(PDF,30) ITEMP
  994.             REPEAT
  995.         WRITE(PDF,30) ITEMP
  996.         REPEAT
  997.       WRITE(PDF,30) ITEMP
  998.       REPEAT
  999.    30 FORMAT(' ',10('B',5A1,'F'))
  1000.       WRITE(PDF,10)
  1001.       RETURN
  1002.       END
  1003. C
  1004. C ********************************************************
  1005. C
  1006.       SUBROUTINE SLIP(LFUSES,I88PRO,ITYPE,IBLOW)
  1007. C
  1008. C this subroutine will blow the entire conditional three state
  1009. C product line when 'IF(VCC)' condition is used for the
  1010. C corresponding output pin
  1011.  
  1012.       IMPLICIT NONE
  1013.       INTEGER IENABL(10,14),I88PRO,ITYPE,IBLOW,IOUT,I
  1014.       LOGICAL LFUSES(40,80)
  1015. C
  1016. C 1=enabled output  0=anything else for that output
  1017. C
  1018.       DATA IENABL/
  1019.      .        0,0,0,0,0,0,0,0,0,0,
  1020.      .        0,0,0,0,0,0,0,0,0,0,
  1021.      .        0,0,0,0,0,0,0,0,0,0,
  1022.      .        0,0,0,0,0,0,0,0,0,0,
  1023.      .        0,0,0,0,0,0,0,0,0,0,
  1024.      .        0,0,0,0,0,0,0,0,0,0,
  1025.      .        1,1,1,1,1,1,1,1,1,1,
  1026.      .        0,0,0,0,0,0,0,0,0,0,
  1027.      .        1,0,0,0,0,0,0,0,0,1,
  1028.      .        1,1,1,0,0,0,0,1,1,1,
  1029.      .        0,1,1,1,1,1,1,1,1,0,
  1030.      .        0,0,0,0,0,0,0,0,0,0,
  1031.      .        0,1,0,0,0,0,0,0,1,0,
  1032.      .        0,1,1,0,0,0,0,1,1,0/
  1033.  
  1034.       IOUT = (I88PRO-1)/8+1
  1035.       IF(IENABL(IOUT,ITYPE).EQ.0) RETURN
  1036.       DO(I=1,40)
  1037.           IBLOW = IBLOW+1
  1038.         LFUSES(I,I88PRO) = .TRUE.
  1039.       REPEAT
  1040.       I88PRO = I88PRO+1
  1041.       RETURN
  1042.       END
  1043. C
  1044. C ********************************************************
  1045. C
  1046.       SUBROUTINE FANTOM(ITYPE,IOP,IOUT,IPROD,I8PRO)
  1047. C
  1048. C this subroutine updates IOUT (the printed fuse plot)
  1049. C for high and low phantom fuses
  1050.  
  1051.       IMPLICIT NONE
  1052.       INTEGER IOUT(64),ITYPE,IOP,IPROD,I8PRO,PR8X10(10,14),
  1053.      .        PROD8(8,11),PRODLN(40,7),IROW,
  1054.      .        HIFANT,IBLANK,LNTYPE,GRTYPE,COL,P,B
  1055.       LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  1056.       COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  1057.       COMMON /BLK/ PR8X10(10,14),PROD8(8,11),PRODLN(40,7)
  1058.       DATA HIFANT/'0'/,IBLANK/' '/
  1059. C
  1060.       IROW=((IPROD-1)/8)+1
  1061.       GRTYPE=PR8X10(IROW,ITYPE)
  1062.       LNTYPE=PROD8(I8PRO,GRTYPE)
  1063. C
  1064.       DO(COL=1,40)
  1065.      IF(PRODLN(COL,LNTYPE).EQ.P.AND.IOP.EQ.P) IOUT(COL)=HIFANT
  1066.      IF(PRODLN(COL,LNTYPE).EQ.P.AND.IOP.EQ.B) IOUT(COL)=IBLANK
  1067. C     IF(PRODLN(COL,LNTYPE).EQ.N) 
  1068.       REPEAT
  1069.       RETURN
  1070.       END
  1071. C
  1072. C ********************************************************
  1073. C
  1074.       SUBROUTINE IODC2
  1075. C
  1076. C this subroutine turns on peripherals (optional)
  1077.  
  1078.       IMPLICIT NONE
  1079.       INTEGER PMS,POF,PDF,DC2,BEL
  1080.       COMMON /LUNIT/ PMS,POF,PDF
  1081.       DATA DC2/18/,BEL/7/
  1082.       WRITE(PDF,10) DC2,BEL
  1083.    10 FORMAT(' ',2A1)
  1084.       RETURN
  1085.       END
  1086. C
  1087. C ********************************************************
  1088. C
  1089.       SUBROUTINE IODC4
  1090. C
  1091. C this subroutine turns off peripherals (optional)
  1092.  
  1093.       IMPLICIT NONE
  1094.       INTEGER PMS,POF,PDF,DC3,DC4,BEL
  1095.       COMMON /LUNIT/ PMS,POF,PDF
  1096.       DATA DC3/19/,DC4/20/,BEL/7/
  1097.       WRITE(PDF,10) BEL,DC3,DC4
  1098.    10 FORMAT(' ',3A1)
  1099.       RETURN
  1100.       END
  1101. C
  1102. C ********************************************************
  1103. C
  1104.       SUBROUTINE TEST(LPHASE,LBUF,TITLE,IC,IL,ILE,ISYM,
  1105.      .                IBUF,ITYPE,cmdline)
  1106. C
  1107. C this subroutine performs the function table simulation
  1108. C and generates test vectors
  1109.  
  1110.       IMPLICIT NONE
  1111.       INTEGER ISYM(8,24),ISYM1(8,24),IBUF(8,24),IVECT(24),
  1112.      .        IVECTP(24),ISTATE(24),ISTATT(24),IPIN(24),TITLE(80),
  1113.      .        IC,IL,ILE,ITYPE,IPAGE(80,200),PMS,POF,PDF,IFUNCT,
  1114.      .        IDESC,IEND,IDASH,L,H,X,C,Z,N0,N1,IBLANK,COMMENT,
  1115.      .        LEN,ITRST,I,J,IMATCH,ICLOCK,IMAX,NVECT,IC1,IL1,
  1116.      .        IINP,ILL,ITEST,IOUTP,XORSUM,ISUM,IPROD,IIFB,IMESS,
  1117.      .        ILERR
  1118.       LOGICAL LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR,LSAME,
  1119.      .          XORFND,LERR,LPHASE(24),LPHAS1(24),LBUF(24),LOUT(24),
  1120.      .          LOUTP(24),LCLOCK,LPTRST,LCTRST,LENABL(24),NREG
  1121.       CHARACTER cmdline*20,simname*25
  1122.       COMMON LBLANK,LLEFT,LAND,LOR,LSLASH,LEQUAL,LRIGHT,LXOR
  1123.       COMMON    /PGE/ IPAGE(80,200)
  1124.       COMMON    /LUNIT/ PMS,POF,PDF
  1125.       COMMON    /FTEST/ IFUNCT,IDESC,IEND
  1126.       DATA IDASH/'-'/,L/'L'/,H/'H'/,X/'X'/,C/'C'/,Z/'Z'/,N0/'0'/,
  1127.      .     N1/'1'/,IBLANK/' '/,COMMENT/';'/
  1128. C
  1129. C open a file for the simulation vectors
  1130. C
  1131.       simname = cmdline
  1132.       len = index(cmdline,' ')
  1133.       simname(len:) = '.sim'
  1134.       OPEN(UNIT=12,FILE=simname,STATUS='new')
  1135. C
  1136. C print an error message if no function table is supplied
  1137. C
  1138.       IF(IFUNCT.NE.0) GO TO 3
  1139.       WRITE(PMS,2)
  1140.     2 FORMAT(/,' FUNCTION TABLE MUST BE SUPPLIED IN ORDER TO PERFORM',
  1141.      .       ' SIMULATION')
  1142.       RETURN
  1143. C
  1144. C print title
  1145. C
  1146.     3 PRINT*,'Writing file ',simname
  1147.       WRITE(12,4) TITLE
  1148.     4 FORMAT(/,' ',80A1,/)
  1149. C
  1150. C initialize LERR (error flag) to no error
  1151. C
  1152.       LERR=.FALSE.
  1153. C
  1154. C set the starting point of the function table to column 0
  1155. C and IFUNCT + 1
  1156. C
  1157.       IC=0
  1158.       IL=IFUNCT + 1
  1159. C
  1160. C initialize ITRST (three state enable function table pin number)
  1161. C
  1162.       ITRST=0
  1163. C
  1164. C make a dummy call to INCR
  1165. C
  1166.       CALL INCR(IC,IL)
  1167. C
  1168. C set the function table pin list (up to 22)
  1169. C and go 1 more than max to look for dashed line
  1170. C
  1171.       DO(I=1,23)
  1172.           CALL GETSYM(LPHAS1,ISYM1,I,IC,IL)
  1173.         DO(J=1,8)
  1174.             IBUF(J,1) = ISYM1(J,I)
  1175.         REPEAT
  1176.         IF(IBUF(8,1).EQ.IDASH) GO TO 12
  1177.         CALL MATCH(IMATCH,IBUF,ISYM)
  1178.         IF(IMATCH.NE.0) GO TO 7
  1179.         WRITE(PMS,6) (IBUF(J,1),J=1,8)
  1180.     6   FORMAT(/,' FUNCTION TABLE PIN LIST ERROR AT ',8A1)
  1181.         RETURN
  1182.     7   LOUT(I) = .FALSE.
  1183.         ISTATT(I) = X
  1184.         IVECTP(I) = X
  1185. C
  1186. C if appropiate pal type, remember location of the clock and the 
  1187. C three state enable pin in the function table pin list
  1188. C
  1189.         IF(.NOT.(ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.10.OR.
  1190.      .    ITYPE.EQ.12.OR.ITYPE.EQ.13.OR.ITYPE.EQ.14) ) GO TO 10
  1191.            IF(IMATCH.EQ.1) ICLOCK = I
  1192.         IF(IMATCH.EQ.13) ITRST = I
  1193.    10   IPIN(I)=IMATCH
  1194.       REPEAT
  1195. C
  1196. C all signal names for the functional test have been read in
  1197. C adjust the count
  1198. C
  1199.    12 IMAX = I - 1
  1200.       NVECT = 0
  1201. C
  1202. C ************ start of main loop for simulation *************
  1203. C
  1204.    90 NVECT = NVECT + 1
  1205.       IC1 = 0
  1206.       IL1 = ILE
  1207. c
  1208. C go passed the comment lines
  1209. C
  1210.    23 IF(IPAGE(1,IL).EQ.COMMENT) THEN
  1211.           IL = IL + 1
  1212.           GO TO 23
  1213.       ENDIF
  1214. C
  1215. C get vectors from the function table
  1216. C
  1217.       DO(I=1,IMAX)
  1218.           IF(IPAGE(IC,IL).EQ.IBLANK) GO TO 21
  1219.         GO TO 22
  1220.    21     IC = IC + 1
  1221.           IF(IPAGE(IC,IL).EQ.IBLANK) GO TO 21
  1222.    22     IVECT(I) = IPAGE(IC,IL)
  1223.           IC = IC + 1
  1224.       REPEAT
  1225. C
  1226. C advance line count to skip function table comments
  1227. C
  1228.       IL = IL + 1
  1229.       IC = 1
  1230.       IF(IVECT(1).EQ.IDASH) GO TO 95
  1231. C
  1232. C check for valid function table values (H,L,X,Z,C)
  1233. C
  1234.       DO(I=1,IMAX)
  1235.         IF((IVECT(I).EQ.H).OR.(IVECT(I).EQ.L).OR.(IVECT(I).EQ.X).OR.
  1236.      .   (IVECT(I).EQ.C).OR.(IVECT(I).EQ.Z)) GO TO 11 
  1237.         WRITE(PMS,8) IVECT(I),NVECT
  1238.     8   FORMAT(/,' ',A1,' IS NOT AN ALLOWED FUNCTION TABLE ',
  1239.      .         'ENTRY IN VECTOR ',I3)
  1240.         RETURN
  1241.    11 REPEAT
  1242. C
  1243. C initialize clock and three state enable flags
  1244. C
  1245.       LCLOCK = .FALSE.
  1246.       LCTRST = .TRUE.
  1247.       LPTRST = .TRUE.
  1248.       DO(I=1,IMAX)
  1249.           LENABL(I) = .TRUE.
  1250.       REPEAT
  1251. C
  1252. C initialize NREG (not registered output) to false
  1253. C
  1254.       NREG = .FALSE.
  1255. C
  1256. C initialize ISTATE array to all X's
  1257. C
  1258.       DO(I=1,24)
  1259.           ISTATE(I)=X 
  1260.       REPEAT
  1261. C
  1262. C check if this pal type has registers
  1263. C
  1264.         IF( .NOT.(ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.10.OR.
  1265.      .   ITYPE.EQ.12.OR.ITYPE.EQ.13.OR.ITYPE.EQ.14) ) GO TO 25
  1266. C
  1267. C check clock and three state enable pins and change flag if needed
  1268. C
  1269.       IF(IVECT(ICLOCK).EQ.C) LCLOCK = .TRUE.
  1270.       IF(ITRST.EQ.0) GO TO 25
  1271.       LSAME = ((LPHASE(13)).AND.(LPHAS1(ITRST)).OR.
  1272.      .        (.NOT.LPHASE(13)).AND.(.NOT.LPHAS1(ITRST)))
  1273.       IF(IVECT(ITRST).EQ.L.AND.(.NOT.LSAME).OR.
  1274.      .   IVECT(ITRST).EQ.H.AND.(LSAME)) LPTRST = .FALSE.
  1275.       IF(LPTRST) GO TO 25
  1276. C
  1277. C disable registered outputs if appropiate
  1278. C
  1279.       DO(I=1,IMAX)
  1280.           J = IPIN(I)
  1281.     IF(J.EQ.17.OR.J.EQ.18.OR.J.EQ.19.OR.J.EQ.20) LENABL(I)=.FALSE.
  1282.           IF((ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.12.OR.
  1283.      .     ITYPE.EQ.13).AND.(J.EQ.16.OR.J.EQ.21)) LENABL(I)=.FALSE.
  1284.           IF((ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.12).AND.
  1285.      .     (J.EQ.15.OR.J.EQ.22)) LENABL(I) = .FALSE.
  1286.           IF(ITYPE.EQ.8.AND.(J.EQ.14.OR.J.EQ.23)) LENABL(I) = .FALSE.
  1287.       REPEAT
  1288. C
  1289. C **************** scan through the logic equations *********
  1290. C
  1291. C make a dummy call to INCR
  1292. C
  1293.    25 CALL INCR(IC1,IL1)
  1294.    26 CALL GETSYM(LBUF,IBUF,1,IC1,IL1)
  1295.       IF(LLEFT) GO TO 29
  1296.    27 IF(.NOT.LEQUAL) GO TO 26
  1297. C
  1298. C evaluate conditional three state product line
  1299. C
  1300.    29 IF(LEQUAL) GO TO 35
  1301.       NREG = .TRUE.
  1302.    33 CALL GETSYM(LBUF,IBUF,1,IC1,IL1)
  1303.       CALL MATCH(IINP,IBUF,ISYM1)
  1304. C
  1305. C check for GND,VCC,/GND,or /VCC in conditional three state
  1306. C product line
  1307. C
  1308.       IF(IINP.NE.0) GO TO 32
  1309.       CALL MATCH(IMATCH,IBUF,ISYM)
  1310.       ILL = IL1
  1311.       IF(IMATCH.EQ.12.AND.(LBUF(1)).OR.
  1312.      .   IMATCH.EQ.24.AND.(.NOT.LBUF(1))) LCTRST = .FALSE.
  1313.       IF(IINP.EQ.0.AND.IMATCH.NE.12.AND.IMATCH.NE.24) GO TO 100
  1314.       GO TO 34
  1315.    32 ITEST = IVECT(IINP)
  1316.       IF(ITEST.EQ.L.AND.(LPHAS1(IINP)).AND.(LBUF(1))
  1317.      .   .OR.ITEST.EQ.H.AND.(LPHAS1(IINP)).AND.(.NOT.LBUF(1))
  1318.      .   .OR.ITEST.EQ.H.AND.(.NOT.LPHAS1(IINP)).AND.(LBUF(1))
  1319.      .   .OR.ITEST.EQ.L.AND.(.NOT.LPHAS1(IINP)).AND.(.NOT.LBUF(1))
  1320.      .   ) LCTRST = .FALSE.
  1321.       IF(ITEST.EQ.X.OR.ITEST.EQ.Z) LCTRST = .FALSE.
  1322.    34 IF(LAND) GO TO 33
  1323.       GO TO 27
  1324. C
  1325. C evaluate the logic equation
  1326. C find pin number of the output vectors
  1327. C
  1328.    35 CALL MATCH(IOUTP,IBUF,ISYM1)
  1329.       ILL = IL1
  1330.       IF(IOUTP.EQ.0) GO TO 100
  1331.       IF(NREG) LENABL(IOUTP) = LCTRST
  1332.       LOUT(IOUTP) = .TRUE.
  1333.       IF(.NOT.LCTRST) LOUT(IOUTP) = .FALSE.
  1334.       LCTRST = .TRUE.
  1335.       LOUTP(IOUTP) = LBUF(1)
  1336. C
  1337. C determine product term and eventually sum for output keeping
  1338. C track to see if an XOR (exclusive or) has been found
  1339. C
  1340.       XORSUM = H
  1341.       XORFND = .FALSE.
  1342.       ISUM = L
  1343.    28 IPROD = H
  1344.    30 ILL = IL1
  1345.       CALL GETSYM(LBUF,IBUF,1,IC1,IL1)
  1346.       CALL MATCH(IINP,IBUF,ISYM1)
  1347.       IF(IINP.NE.0) GO TO 45
  1348.       CALL MATCH(IMATCH,IBUF,ISYM)
  1349.       IF(IMATCH.NE.12) GO TO 100
  1350.       ITEST = L
  1351.       IINP = 23
  1352.       LPHAS1(23) = .TRUE.
  1353.       GO TO 37
  1354.    45 ITEST = IVECT(IINP)
  1355. C
  1356. C get feed back values
  1357. C
  1358.       IF((.NOT.LCLOCK).OR.(NREG)) GO TO 37
  1359.       CALL MATCH(IIFB,IBUF,ISYM)
  1360.       IF((ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.10.OR.ITYPE.EQ.12.OR.
  1361.      .    ITYPE.EQ.13.OR.ITYPE.EQ.14) .AND.(IIFB.EQ.17.OR.IIFB.EQ.18.OR.
  1362.      .    IIFB.EQ.19.OR.IIFB.EQ.20)) ITEST = IVECTP(IINP)
  1363.       IF((ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.12.OR.ITYPE.EQ.13)
  1364.      .   .AND.(IIFB.EQ.16.OR.IIFB.EQ.21)) ITEST = IVECTP(IINP)
  1365.       IF((ITYPE.EQ.8.OR.ITYPE.EQ.9.OR.ITYPE.EQ.12).AND.
  1366.      .   (IIFB.EQ.15.OR.IIFB.EQ.22)) ITEST = IVECTP(IINP)
  1367.       IF((ITYPE.EQ.8).AND.(IIFB.EQ.14.OR.IIFB.EQ.23)) 
  1368.      .    ITEST = IVECTP(IINP)
  1369.    37 IF(ITEST.EQ.X.OR.ITEST.EQ.Z) ITEST = L
  1370.       IF(ITEST.EQ.L.AND.(LPHAS1(IINP)).AND.(LBUF(1))
  1371.      .   .OR.ITEST.EQ.H.AND.(LPHAS1(IINP)).AND.(.NOT.LBUF(1))
  1372.      .   .OR.ITEST.EQ.H.AND.(.NOT.LPHAS1(IINP)).AND.(LBUF(1))
  1373.      .   .OR.ITEST.EQ.L.AND.(.NOT.LPHAS1(IINP)).AND.(.NOT.LBUF(1))
  1374.      .   ) IPROD = L
  1375.       IF(LAND) GO TO 30
  1376.       IF(ISUM.EQ.L.AND.IPROD.EQ.X) ISUM = X
  1377.       IF((ISUM.NE.H).AND.IPROD.EQ.H) ISUM = H
  1378. C
  1379. C check for XOR (exclusive or) and save intermediate value
  1380. C
  1381.       IF(.NOT.LXOR) GO TO 31
  1382.       XORSUM = ISUM
  1383.       XORFND = .TRUE.
  1384.       ISUM = L
  1385.       GO TO 28
  1386.    31 IF(LOR) GO TO 28
  1387. C
  1388. C if end of equation has been found, determine final sum and save it
  1389. C
  1390.       IF(.NOT.XORFND) ISTATT(IOUTP) = ISUM
  1391.       IF((XORFND).AND.((ISUM.EQ.L.AND.XORSUM.EQ.L).OR.
  1392.      .  (ISUM.EQ.L.AND.XORSUM.EQ.H))) ISTATT(IOUTP) = L
  1393.       IF((XORFND).AND.((ISUM.EQ.H.AND.XORSUM.EQ.L).OR.
  1394.      .  (ISUM.EQ.L.AND.XORSUM.EQ.H))) ISTATT(IOUTP) = H
  1395.       IF((XORFND).AND.((ISUM.EQ.X.AND.XORSUM.EQ.X)))ISTATT(IOUTP)=X 
  1396.       NREG = .FALSE.
  1397. C
  1398. C check if all equations have been processed by comparing current
  1399. C line number with function table line number
  1400. C
  1401.       IF(IDESC.NE.0.AND.IL1.LT.IFUNCT.AND.IL1.LT.IDESC.OR.
  1402.      .   IDESC.EQ.0.AND.IL1.LT.IFUNCT) GO TO 27
  1403. C
  1404. C determine output logic values
  1405. C compare outputs to see if vector agrees with results
  1406. C
  1407.       DO(I=1,IMAX)
  1408.           IF(.NOT.LOUT(I)) GO TO 50
  1409.         IF(ISTATT(I).EQ.X.AND.IVECT(I).EQ.X) GO TO 50
  1410.         LSAME = ((LOUTP(I)).AND.(LPHAS1(I)).OR.
  1411.      .          (.NOT.LOUTP(I)).AND.(.NOT.LPHAS1(I)))
  1412.       IMESS = 40
  1413.       IF(ISTATT(I).EQ.L.AND.IVECT(I).EQ.L.AND.(.NOT.LSAME))IMESS=41
  1414.       IF(ISTATT(I).EQ.H.AND.IVECT(I).EQ.H.AND.(.NOT.LSAME))IMESS=42
  1415.       IF(ISTATT(I).EQ.L.AND.IVECT(I).EQ.H.AND.(LSAME)) IMESS = 42
  1416.       IF(ISTATT(I).EQ.H.AND.IVECT(I).EQ.L.AND.(LSAME)) IMESS = 41
  1417.       IF((LENABL(I)).AND.IVECT(I).EQ.Z) IMESS = 43
  1418.       IF((.NOT.LENABL(I)).AND.(LOUT(I)).AND.IVECT(I).NE.Z)IMESS=44
  1419.       IF(IMESS.NE.40) LERR = .TRUE.
  1420.       IF(IMESS.EQ.41) WRITE(PMS,41) NVECT,(ISYM1(J,I),J=1,8)
  1421.    41 FORMAT(/,' FUNCTION TABLE ERROR IN VECTOR',I3,' PIN =',8A1,
  1422.      .        ' EXPECT = H ACTUAL = L')
  1423.       IF(IMESS.EQ.42) WRITE(PMS,42) NVECT,(ISYM1(J,I),J=1,8)
  1424.    42 FORMAT(/,' FUNCTION TABLE ERROR IN VECTOR',I3,' PIN =',8A1,
  1425.      .        ' EXPECT = L ACTUAL = H')
  1426.       IF(IMESS.EQ.43) WRITE(PMS,43) NVECT,(ISYM1(J,I),J=1,8)
  1427.    43 FORMAT(/,' FUNCTION TABLE ERROR IN VECTOR',I3,' PIN =',8A1,
  1428.      .        ' EXPECT = OUTPUT ENABLE ACTUAL = Z')
  1429.       IF(IMESS.EQ.44) WRITE(PMS,44) NVECT,(ISYM1(J,I),J=1,8),IVECT(I)
  1430.    44 FORMAT(/,' FUNCTION TABLE ERROR IN VECTOR',I3,' PIN =',8A1,
  1431.      .        ' EXPECT = Z ACTUAL = ',A1)
  1432.    50 REPEAT
  1433. C
  1434. C change the order of vectors from the order of appearance in the
  1435. C function table to that of the pin list and tweek for output
  1436.       DO(I=1,24)
  1437.           DO(J=1,IMAX)
  1438.             IF(IPIN(J).NE.I) GO TO 55
  1439.             IF(IVECT(J).EQ.L.OR.IVECT(J).EQ.H) GO TO 51
  1440.             ISTATE(I) = IVECT(J)
  1441.             GO TO 65
  1442.    51       LSAME = ((LPHASE(I)).AND.(LPHAS1(J)).OR.
  1443.      .        (.NOT.LPHASE(I)).AND.(.NOT.LPHAS1(J)))
  1444.       IF(ITYPE.EQ.6.AND.(I.EQ.18.OR.I.EQ.19))LOUT(J)=.TRUE.
  1445.             IF((.NOT.LOUT(J)).AND.(LSAME).AND.
  1446.      .      IVECT(J).EQ.L) ISTATE(I) = N0 
  1447.             IF((.NOT.LOUT(J)).AND.(LSAME).AND.
  1448.      .      IVECT(J).EQ.H) ISTATE(I) = N1
  1449.             IF((.NOT.LOUT(J)).AND.(.NOT.LSAME).AND.
  1450.      .      IVECT(J).EQ.L) ISTATE(I) = N1
  1451.             IF((.NOT.LOUT(J)).AND.(.NOT.LSAME).AND.
  1452.      .      IVECT(J).EQ.H) ISTATE(I) = N0
  1453.             IF((LOUT(J)).AND.(LSAME).AND.
  1454.      .      IVECT(J).EQ.L.AND.(LENABL(J))) ISTATE(I) = L
  1455.             IF((LOUT(J)).AND.(LSAME).AND.
  1456.      .      IVECT(J).EQ.H.AND.(LENABL(J))) ISTATE(I) = H
  1457.             IF((LOUT(J)).AND.(.NOT.LSAME).AND.
  1458.      .      IVECT(J).EQ.L.AND.(LENABL(J))) ISTATE(I) = H
  1459.             IF((LOUT(J)).AND.(.NOT.LSAME).AND.
  1460.      .      IVECT(J).EQ.H.AND.(LENABL(J))) ISTATE(I) = L
  1461.              GO TO 65
  1462.    55     REPEAT
  1463. C
  1464. C save present vectors for feed back used with next set of vectors
  1465. C if clock pulse and not Z ( Z would be an unrealistic value)
  1466. C
  1467.    65 IF((LCLOCK).AND.IVECT(J).NE.Z) IVECTP(J) = IVECT(J)
  1468.       REPEAT
  1469. C
  1470. C assign X to ground and 1 to VCC pin
  1471. C
  1472.       ISTATE(12) = X
  1473.       ISTATE(24) = N1
  1474. C
  1475. C print test vectors
  1476. C
  1477.       WRITE(12,60) NVECT,(ISTATE(I),I=1,24)
  1478.    60 FORMAT(' ',I2,' ',24A1)
  1479.       GO TO 90
  1480. C
  1481. C terminate the simulation
  1482. C
  1483.    95 IF(.NOT.LERR) WRITE(12,67)
  1484.    67 FORMAT(/,' PASS SIMULATION')
  1485.       IF(.NOT.LERR) WRITE(PMS,68)
  1486.    68 FORMAT(/,' PASS SIMULATION')
  1487.       CLOSE(12)
  1488.       RETURN
  1489. C
  1490. C print an error message for an undefined pin name
  1491. C
  1492.   100 ILERR = ILL+4
  1493.       WRITE(PMS,101) (IBUF(I,1),I=1,8),ILERR,(IPAGE(I,ILL),I=1,80)
  1494.   101 FORMAT(/,' ERROR SYMBOL = ',8A1,'       IN LINE NUMBER ',I3,
  1495.      .      /,' ',80A1,/,' THIS PIN NAME IS NOT DEFINED IN THE ',
  1496.      .      ' FUNCTION TABLE PIN LIST')
  1497.       RETURN
  1498.       END
  1499.